package com.xmu.prcs.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;

import com.xmu.prcs.util.PageBean;

/**
 * 基础Dao
 * @author frequent
 * @version 1.0,2012-3-19
 * @param <T>
 */
public interface GenericDao<T> {

	/**
	 * 生成"from XX [where query]"类型的hql查询语句 (XXX为调用此函数的类名)
	 * 
	 * @param query
	 *            查询条件
	 * @return 如果query==null或者query==""则返回from XX,否者返回 from XX where query
	 */
	public String buildQuery(String query);

	/**
	 * 获得通过countHql查询得到的记录的数目
	 * 
	 * @param countHql
	 * @return
	 */
	public Long count(String countHql);

	/**
	 * 获得通过带参数的countHql查询得到的记录的数目
	 * 
	 * @param countHql
	 * @param value
	 * @return
	 */
	public Long count(String countHql, Object value);

	/**
	 *  获得通过带多个参数的countHql查询得到的记录的数目
	 * 
	 * @param countHql
	 * @param values
	 * @return
	 */
	public Long count(String countHql, Object[] values);


	/**
	 * 根據ID判斷數據是否存在
	 * 
	 * @param id
	 *            數據ID
	 * @return 存在則返回true，否則返回false
	 */
	public boolean exists(Integer id);

	/**
	 * 通过条件查询
	 * @param criteria
	 * @return
	 */
	public List<T> findByCriteria(DetachedCriteria criteria);

	/**
	 * hql查询
	 * 
	 * @param propertyNames
	 * @param values
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List findByHql(String hql, Object[] values);

	/**
	 * 
	 *         hql 分页查询
	 * @param hql
	 * @param values
	 * @param page
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List findByHql4Page(String hql, Object[] values, PageBean page);

	public void flush();

	/**
	 * 根據ID索取數據
	 * 
	 * @param id
	 *            預訪問數據的ID
	 * @return 若數據庫中存在則返回，否則返回null
	 */
	public T get(Integer id);

	/**
	 * 返回數據庫中所有數據
	 * 
	 * @return 记录列表
	 */
	public List<T> getAll();

	/**
	 * 返回數據庫中的部分數據
	 * 
	 * @param index
	 *            開始條目
	 * @param count
	 *            個數
	 * @return 記錄列表
	 */
	public List<T> getAll(int index, int count);

	/**
	 * 返回數據庫中的記錄個數
	 * 
	 * @return 記錄個數
	 */
	public int getCount();

	/**
	 *  重新打开
	 */
	public Session openSession();

	/**
	 * 刪除數據
	 * 
	 * @param id
	 *            預刪除數據的ID
	 */
	public void remove(Integer id);

	/**
	 * 没有flush的删除数据
	 * 
	 * @param id
	 */
	public void removeWithoutFlush(Integer id);

	/**
	 * 保存數據
	 * 
	 * @param object
	 *            要保存的數據
	 */
	public void save(T object);

	/**
	 * 更新数据
	 * 
	 * @param object
	 *            要更新的数据信息
	 */
	public void update(T object);

	/**
	 * 更新数据(不进行merge)
	 * 
	 * @param object
	 */
	public void updateWithoutMerge(T object);
	
	/**
	 * 整合数据
	 * @param object
	 */
	public void merge(T object);
}
